package br.com.estevam.gallery.base;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import br.com.estevam.gallery.data.ImagemData;
import br.com.estevam.gallery.tools.DBConnection;

public class ImagemDAO {

	private Connection con = null;
	private ResultSet rs = null;
	private PreparedStatement pstmt = null;

	public ImagemDAO() throws SQLException, IOException, ClassNotFoundException, IllegalAccessException, InstantiationException {
		con = DBConnection.getConnection();
	}

	public List<ImagemData> busca(String palavra) throws SQLException {
		String sql = "select id, nome, descricao, tamanho from imagens "
			+ "where nome like ? or descricao like ? order by nome";
		List<ImagemData> resultado = new ArrayList<ImagemData>();
		try {
			pstmt = con.prepareStatement(sql);
			String exprLike = "%" + palavra + "%";
			pstmt.setString(1, exprLike);
			pstmt.setString(2, exprLike);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				ImagemData dados = new ImagemData();
				dados.setId(rs.getInt(1));
				dados.setNome(rs.getString(2));
				dados.setDescricao(rs.getString(3));
				dados.setTamanho(rs.getInt(4));
				resultado.add(dados);
			}
			
			return resultado;
			
		} finally {
			limpa();
		}
	}

	public InputStream abreImagem(int id) throws SQLException {
		String sql = "select imagem from imagens where id = ?";
		InputStream is = null;
		try {
			pstmt = con.prepareStatement(sql);
			pstmt.setInt(1, id);
			rs = pstmt.executeQuery();
			
			while (rs.next()) {
				is = rs.getBinaryStream(1);
			}
			
			return is;
			
		} finally {
			limpa();
		}
	}

	private void limpa() {
		try {
			if (rs != null) rs.close();
			if (pstmt!= null) pstmt.close();
			
		} catch (SQLException ex) {
			// não faz nada
		}
	}

	public void fechaBanco() {
		limpa();
		try {
			if (con != null) con.close();
			
		} catch (SQLException ex) {
			// não faz nada
		}
	}

}
